2.4 链上合约
因为根据解锁脚本+赎回脚本的方式确定NOTE写的数据区域,在数据区域之外可以使用包括多重签名,哈希锁在内的复杂脚本。
2.4.1 多签
使用类似下面的合约可以实现多签
- 锁定脚本:
NOTE OP_2DROP OP_2DROP OP_2DROP <m> <A pubkey> [B pubkey] [C pubkey...] <n> OP_CHECKMULTISIG
- 解锁脚本:
OP_0 <A sig> [B sig] [C sig...] DATA0 DATA1 DATA2 DATA3 Flag
也可以构造正确的赎回脚本使用P2SH/P2WSH/P2TR进行多签。
2.4.2 复杂合约
通过更加复杂的锁定脚本可以创建链上智能合约,只有满足合约条件的交易才能上链。下面是一个简单的哈希锁示例,此段脚本实现了要求提供除了签名之外的特定message才能发起交易,让信息上链。
class HashLock extends SmartContract {
@prop()
static note: ByteString = toByteString('NOTE', true)
@prop()
pubKey: PubKey
@prop()
hash: ByteString
constructor(pubKey: PubKey, hash: Sha256) {
super(...arguments)
this.pubKey = pubKey
this.hash = hash
}
@method()
public unlock(
sig: Sig,
message: ByteString,
data0: ByteString,
data1: ByteString,
data2: ByteString,
data3: ByteString,
data4: ByteString
) {
Scryptdemo.note
assert(sha256(message) == this.hash, 'Hash does not match')
assert(this.checkSig(sig, this.pubKey), 'signature check failed')
}
}
编译后的脚本为
044e4f54450000<pubKey><hash>78547a7572537a76537a7577775279755879a8788859795279ac77777777777777777777
ASM为
4e4f5445 0 0 <pubKey> <hash> OP_OVER OP_4 OP_ROLL OP_DROP OP_2SWAP OP_3 OP_ROLL OP_DUP OP_3 OP_ROLL OP_DROP OP_NIP OP_NIP OP_2 OP_PICK OP_DROP OP_8 OP_PICK OP_SHA256 OP_OVER OP_EQUALVERIFY OP_9 OP_PICK OP_2 OP_PICK OP_CHECKSIG OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP
示例合约使用sCrypt高级比特币脚本语言制作。 无论是最简单的脚本还是复杂的合约,在由解锁脚本和赎回/锁定脚本构成的交易脚本中,数据的格式和 顺序都必须遵循本协议的规定。